def get_formatted_name(first_name, last_name):
    """返回整洁的姓名"""
    full_name = first_name + ' ' + last_name
    return full_name.title()
musician = get_formatted_name('jimi', 'hendrix')
print(musician)

#返回多个值可以用列表，字典，类
def build_person(first_name, last_name):
    """返回一个字典，其中包含有关一个人的信息"""
    person = {'first': first_name, 'last': last_name}
    return person
musician = build_person('jimi', 'hendrix')
print(musician)

#参数传递，值传递，引用传递
#值传递
num = 10
def changeNum(num):
    num = 20

print("调用前："+str(num))
changeNum(num)
print("调用后："+str(num))
# 类，数组，map ：引用类型
nums = [10]
def change_nums(nums):
    nums[0] = 20
print("调用前："+str(nums))
change_nums(nums)
print("调用后："+str(nums))
#有时候，需要禁止函数修改列表。例如，假设像前一个示例那样，你有一个未打印的设计列表，并编写了一个将这些设计移到打印好的模型列表中的函数。你可能会做出这样的
# 决定：即便打印所有设计后，也要保留原来的未打印的设计列表，以供备案。但由于你将所有的设计都移出了unprinted_designs ，这个列表变成了空的，原来的列表没有
# 了。为解决这个问题，可向函数传递列表的副本而不是原件；这样函数所做的任何修改都只影响副本，而丝毫不影响原件。
nums = [10,20]
def change_nums(nums):
    nums[0] = 20
print("调用前："+str(nums))
change_nums(nums[:])
print("调用后："+str(nums))

# 传递任意数量的实参
# 有时候，你预先不知道函数需要接受多少个实参，好在Python允许函数从调用语句中收集任意数量的实参。
# 例如，来看一个制作比萨的函数，它需要接受很多配料，但你无法预先确定顾客要多少种配料。下面的函数只有一个形参*toppings ，但不管调用语句提供了多少实参，这个
# 形参都将它们统统收入囊中：
def make_pizza(*toppings):
    """打印顾客点的所有配料"""
    print(toppings)
make_pizza('pepperoni')
make_pizza('mushrooms', 'green peppers', 'extra cheese')


# 将函数存储在模块中